package com.bkhech.home.practice.javacore.nio;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

public class ByteBufferSpliceDemo {

    public static void main(String[] args) throws IOException {
        // 创建一个 Pipe
        Pipe pipe = Pipe.open();

        // 获取读通道和写通道
        ReadableByteChannel sourceChannel = pipe.source();
        WritableByteChannel sinkChannel = pipe.sink();

        // 创建一个 ByteBuffer 并写入数据
        ByteBuffer buffer = ByteBuffer.allocate(48);
        buffer.put("Hello, World!".getBytes());
        buffer.flip();  // 切换到读模式

        // 将 ByteBuffer 的数据写入 Pipe 的 sink 通道
        while (buffer.hasRemaining()) {
            sinkChannel.write(buffer);
        }

        // 重新分配一个 ByteBuffer 用于从 Pipe 的 source 通道读取数据
        ByteBuffer readBuffer = ByteBuffer.allocate(48);

        // 使用 splice 方法将数据从 Pipe 的 source 通道读取并写入另一个 ByteBuffer
        while (sourceChannel.read(readBuffer) > 0) {
            readBuffer.flip();  // 切换到读模式
            while (readBuffer.hasRemaining()) {
                System.out.print((char) readBuffer.get());
            }
            readBuffer.clear();  // 清空 readBuffer
        }

        sourceChannel.close();
        sinkChannel.close();
    }
}
